package ecom.ejb;

import ecom.entity.Account;
import ecom.entity.AccountRemote;
import ecom.entity.CommandeRemote;
import ecom.entity.Product;
import ecom.entity.ProductRemote;
import ecom.entity.ProductStore;
import ecom.entity.ProductStoreRemote;
import exceptions.IdentifiantInvalide;
import exceptions.InstanceInvalide;
import java.util.HashSet;
import javax.ejb.Remote;
import javax.ejb.Stateful;

@Stateful
@Remote(AdminRemote.class)
public class AdminBean extends CommonBean implements AdminRemote {


    @Override
    public AccountRemote createAccount(String iban, double solde,
	    String identifiant, String motDePasse) throws IdentifiantInvalide,
	    InstanceInvalide {
	AccountRemote retour = null;

	Account.verifierIban(iban);
	if (em.find(Account.class, iban) == null) { 
	    /*
	     * Vérification de l'instance
	     */
	    AccountRemote temp = new Account(iban, solde,new HashSet<CommandeRemote>(), identifiant, motDePasse);
	    Account.verifierInstance(temp);

	    em.persist(temp);
	    retour = temp;
	} else {
	    throw new IdentifiantInvalide(
		    "L'iban du Compte est déjà utilisé : " + iban);
	}

	return retour;
    }
    
    @Override
    public void removeAccount(AccountRemote account) throws IdentifiantInvalide {
	/*
	 * Récupération de l'instance attachée à la session
	 */
	AccountRemote accountPersistence = this.getAccount(account.getIban());

	if (accountPersistence != null) {
	    em.remove(accountPersistence);
	}
    }
    
    @Override
    public ProductStoreRemote createProductStore(Long referenceProductStore,
            String ibanAccount, String nomProductStore)
	    throws IdentifiantInvalide, InstanceInvalide {
	ProductStoreRemote retour = null;

	/*
	 * Vérification des paramètres
	 */
	Account.verifierIban(ibanAccount);
	ProductStore.verifierReference(referenceProductStore);

	/*
	 * Vérification présence du compte
	 */
	Account compte = em.find(Account.class, ibanAccount);
	if (compte != null) {
	    /*
	     * Vérification si identifiant disponible
	     */
	    if (em.find(ProductStore.class, referenceProductStore) == null) {
		/*
		 * Vérification de l'instance
		 */
		ProductStoreRemote temp = new ProductStore(referenceProductStore, nomProductStore,
			compte, new HashSet<ProductRemote>());
		ProductStore.verifierInstance(temp);

		em.persist(temp);
		retour = temp;
	    } else {
		throw new IdentifiantInvalide(
			"La référence du ProductStore existe déjà : "
				+ referenceProductStore);
	    }
	} else {
	    throw new IdentifiantInvalide("L'iban du Compte est introuvable : "
		    + ibanAccount);
	}

	return retour;
    }

    @Override
    public void updateProductStore(ProductStoreRemote productStore)
	    throws IdentifiantInvalide, InstanceInvalide {
	ProductStore.verifierInstance(productStore);

	/*
	 * Récupération de l'instance que l'on va modifier
	 */
	ProductStoreRemote ProductStorePersistence = this.getProductStore(productStore
		.getReference());

	if (ProductStorePersistence != null) {
	    ProductStorePersistence.setName(productStore.getName());
	    ProductStorePersistence.setAccount(productStore.getAccount());
	}
    }

    @Override
    public void removeProductStore(ProductStoreRemote ProductStore) throws IdentifiantInvalide {
	/*
	 * Récupération de l'instance attachée à la session
	 */
	ProductStoreRemote ProductStorePersistence = this.getProductStore(ProductStore
		.getReference());

	if (ProductStorePersistence != null) {
	    em.remove(ProductStorePersistence);
	}
    }


    @Override
    public ProductRemote createProduct(Long referenceProduct,
	    String nomProduct, double prixProduct, Long referenceProductStore,
	    String urlImage) throws IdentifiantInvalide, InstanceInvalide {
	Product retour = null;

	// Vérification des paramètres
	Product.verifierReference(referenceProduct);
	ProductStore.verifierReference(referenceProductStore);
	ProductStore magasin = em.find(ProductStore.class, referenceProductStore);

	if (magasin != null) {
	    if (em.find(Product.class, referenceProduct) == null) {
		/*
		 * Vérification de l'instance
		 */
		Product temp = new Product(referenceProduct, nomProduct,
			prixProduct, magasin, urlImage);
		Product.verifierInstance(temp);

		em.persist(temp);
		retour = temp;
	    } else {
		throw new IdentifiantInvalide(
			"La référence du Product existe déjà : "
				+ referenceProduct);
	    }
	} else {
	    throw new IdentifiantInvalide(
		    "La référence du ProductStore est introuvable : "
			    + referenceProductStore);
	}

	return retour;
    }

    @Override
    public void updateProduct(ProductRemote produit) throws IdentifiantInvalide {
	// Récupération de l'instance à modifier
	ProductRemote produitPersistence = this.getProduct(produit
		.getReference());

	/*
	 * Modification de la valorisation si présent
	 */
	if (produitPersistence != null) {
	    produitPersistence.setName(produit.getName());
	    produitPersistence.setProductStore(produit.getProductStore());
	    produitPersistence.setPrice(produit.getPrice());
	}
    }

    @Override
    public void removeProduct(ProductRemote produit) throws IdentifiantInvalide {
	// Récupération de l'instance attachée à la session
	ProductRemote produitPersistence = this.getProduct(produit
		.getReference());

	if (produitPersistence != null) {
	    em.remove(produitPersistence);
	}
    }

}
